package solitaire.controle;

import solitaire.InterfacesControle.ICCarte;
import solitaire.InterfacesControle.ICSabot;
import solitaire.InterfacesControle.ICTas;
import solitaire.InterfacesControle.ICTasDeCartes;
import solitaire.InterfacesPresentation.IPSabot;
import solitaire.application.Carte;
import solitaire.application.Sabot;
import solitaire.application.Usine;
import solitaire.presentation.PSabot;

public class CSabot extends Sabot implements ICSabot{

	private IPSabot presentation;
	
	public CSabot(String nom, Usine usine) {
		super(nom, usine);
		presentation = new PSabot(((ICTas) super.visibles).getPresentation(),((ICTas) super.cachees).getPresentation());
		presentation.setControleur(this);
	}

	@Override
	public IPSabot getPresentation() {
		return presentation;
	}

	@Override
	public Sabot getAbstraction() {
		return this;
	}

	@Override
	public boolean isEmpilable(ICCarte carte) {
		return super.isEmpilable(carte.getAbstraction());
	}

	@Override
	public void retournerCartes() {
		System.out.println("---------retournerCartes---------");
			try {
				super.retourner();
				while(!super.visibles.isVide()){
					super.cachees.empiler(super.getSommet());
					super.visibles.depiler();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
	}

	@Override
	public ICTas getVisible() {
		return (ICTas) this.visibles;
	}

	@Override
	public ICTas getCache() {
		return (ICTas) this.cachees;
	}

	@Override
	public void empiler(Carte cartet) {
		ICCarte carte=(ICCarte) cartet;
		super.empiler(carte.getAbstraction());
		presentation.empiler(carte.getPresentation());
		
	}

	@Override
	public ICCarte getICCarte(int n) {
		ICCarte carte=null;
		try {
			carte= (ICCarte) super.getCarte(n);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return carte;
	}

	@Override
	public void retournerCarte() {
		try {
			super.retournerCarte();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	@Override
	public ICCarte getICCarteBase() {
		ICCarte carte=null;
		try {
			carte=(ICCarte) super.getBase();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return carte;
	}

	@Override
	public ICCarte getICCarteSommet() {
		ICCarte carte=null;
		try {
			carte=(ICCarte) super.getSommet();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return carte;
	}
	
	public void depiler() {
		try {
			super.depiler();
			super.cachees.depiler();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void depilerICCarte() {
		try {
			super.depiler();
			presentation.depiler();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
	}

	@Override
	public boolean isEmpilable(ICTas tas) {
		return super.isEmpilable(tas.getAbstraction());
	}

	@Override
	public boolean isEmpilable(ICTas tas, int n) {
		return super.isEmpilable(tas.getAbstraction(), n);
	}

	@Override
	public void recopier(ICTas tas) {
		//TODO?
		
	}

	@Override
	public void retournerCCarte() {
		try {
			super.retournerCarte();
			super.visibles.empiler(super.cachees.getSommet());
			super.visibles.getSommet().setFaceVisible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
	}

	@Override
	public ICTas copy() {
		ICTas tas=null;
		try {
			tas= (ICTas) this.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return tas;
	}

	@Override
	public void clicSabot() {
		//essaye de retourner 3 cartes du sabot
		for(int i=0;i<3;i++){
			if(super.cachees.getNombre()>0){
				try {
					retournerCarte();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			
		}
		
	}

	@Override
	public ICTasDeCartes getTasVisible() {
		ICTasDeCartes tas=null;
		tas=(ICTasDeCartes) super.visibles;
		return tas;
	}

	@Override
	public ICTasDeCartes getTasCache() {
		ICTasDeCartes tas=null;
		tas=(ICTasDeCartes) super.cachees;
		return tas;
	}

	@Override
	public void empiler(ICTas tas) {
		super.empiler(tas.getAbstraction());
		
	}
	

}
